package ar.com.sectorwine.services;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import ar.com.sectorwine.dto.PublicacionDTO;
import ar.com.sectorwine.dto.PublicacionDTOMapper;
import ar.com.sectorwine.entities.ContadorReblog;
import ar.com.sectorwine.entities.Empresa;
import ar.com.sectorwine.entities.EstadoPublicacion;
import ar.com.sectorwine.entities.Publicacion;
import ar.com.sectorwine.entities.TipoPublicacion;
import ar.com.sectorwine.entities.Users;
import ar.com.sectorwine.repository.EmpresaRepository;
import ar.com.sectorwine.repository.EstadoPublicacionRepository;
import ar.com.sectorwine.repository.PublicacionRepository;
import ar.com.sectorwine.repository.TipoPublicacionRepository;
import ar.com.sectorwine.segimiento.Sujeto;

@Service
@Transactional(propagation = Propagation.MANDATORY)
public class PublicacionesServiceImpl implements PublicacionesService {

	@Autowired
	PublicacionRepository publicacionRepository;

	@Autowired
	EstadoPublicacionRepository estadoPublicacionRepository;

	@Autowired
	TipoPublicacionRepository tipoPublicacionRepository;

	@Autowired
	EmpresaRepository empresaRepository;

	@Autowired
	PublicacionDTOMapper publicacionDTOMapper;

	@Override
	public Publicacion crearPublicacion(Empresa empresa, Users user,
			int tipoPublicacion, String cuerpo, String titulo, String imagen,
			String breveDescripcion, String url, String fuente, List<String> tag) {
		Publicacion publicacion = new Publicacion();
		publicacion.setEmpresa(empresa);
		publicacion.setUsuarioCreador(user);
		publicacion.setFechaPublicacion(new Date());
		publicacion.setFechaUltimaModificacion(new Date());
		publicacion.setBreveDescripcion(breveDescripcion);
		publicacion.setTitulo(titulo);
		publicacion.setCuerpo(cuerpo);
		publicacion.setImagen(imagen);
		ArrayList<EstadoPublicacion> listaEstados = (ArrayList<EstadoPublicacion>) estadoPublicacionRepository
				.findAll();
		publicacion.setEstadoPublicacion(listaEstados.get(0));
		publicacion.setUrl(url);
		publicacion.setTags(tag);
		publicacion.setFuente(fuente);
		publicacion.setContadorReblog(new ContadorReblog());

		switch (tipoPublicacion) {
		case 1:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("enlace").get(0));
			break;
		case 2:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("imagen").get(0));
			break;
		case 3:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("noticia").get(0));
			break;
		case 4:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("estado").get(0));
			break;
		case 5:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("video").get(0));
			break;
		case 6:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("menciones").get(0));
			break;
		}

		Sujeto.getInstancia().publicar();

		return publicacionRepository.save(publicacion);
	}

	@Override
	public Publicacion crearPublicacion(Empresa empresa, Users user,
			Publicacion pub, int tipoPublicacion) {
		switch (tipoPublicacion) {
		case 1:
			pub.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("enlace").get(0));
			break;
		case 2:
			pub.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("imagen").get(0));
			break;
		case 3:
			pub.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("noticia").get(0));
			break;
		case 4:
			pub.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("estado").get(0));
			break;
		case 5:
			pub.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("video").get(0));
			break;
		case 6:
			pub.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("menciones").get(0));
			break;
		}

		Sujeto.getInstancia().publicar();
		pub.setEmpresa(empresa);
		
		if(pub.getFechaPublicacion() == null){
			pub.setFechaPublicacion(Calendar.getInstance().getTime());
		}
		
		return publicacionRepository.save(pub);

	}

	@Override
	public Publicacion crearPublicacion(Empresa empresa, Users user,
			int tipoPublicacion, String cuerpo, String titulo, String imagen,
			String breveDescripcion, String url, String fuente, String tag) {
		Publicacion publicacion = new Publicacion();
		publicacion.setEmpresa(empresa);
		publicacion.setUsuarioCreador(user);
		publicacion.setFechaPublicacion(new Date());
		publicacion.setFechaUltimaModificacion(new Date());
		publicacion.setBreveDescripcion(breveDescripcion);
		publicacion.setTitulo(titulo);
		publicacion.setCuerpo(cuerpo);
		publicacion.setImagen(imagen);
		ArrayList<EstadoPublicacion> listaEstados = (ArrayList<EstadoPublicacion>) estadoPublicacionRepository
				.findAll();
		publicacion.setEstadoPublicacion(listaEstados.get(0));
		publicacion.setUrl(url);
		publicacion.setContadorReblog(new ContadorReblog());
		String[] listaTags = tag.split(",");
		ArrayList<String> tags_ = new ArrayList<String>();
		for (int i = 0; i < listaTags.length; i++) {
			tags_.add(listaTags[i]);
		}
		publicacion.setTags(tags_);
		publicacion.setFuente(fuente);

		switch (tipoPublicacion) {
		case 1:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("enlace").get(0));
			break;
		case 2:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("imagen").get(0));
			break;
		case 3:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("noticia").get(0));
			break;
		case 4:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("estado").get(0));
			break;
		case 5:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("video").get(0));
			break;
		case 6:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("menciones").get(0));
			break;
		}

		Sujeto.getInstancia().publicar();

		return publicacionRepository.save(publicacion);
	}

	@Override
	public List<Publicacion> obtenerPublicaciones(Empresa empresa) {
		return publicacionRepository.findAllOrdenados();

	}

	public List<Publicacion> obtenerPublicaciones() {
		return publicacionRepository.findAllOrdenados();

	}

	@Override
	public List<TipoPublicacion> obtenerTipoPublicaciones() {
		List<TipoPublicacion> tiposPublicacion = tipoPublicacionRepository
				.findAll();
		return tiposPublicacion;

	}

	@Override
	public List<Publicacion> obtenerPublicaciones(Empresa empresa,
			TipoPublicacion tipoPublicacion) {
		return publicacionRepository.findAllByEmpresaAndTipoPublicacion(
				empresa, tipoPublicacion);

	}

	@Override
	public void eliminarPublicacion(Long pubId) {
		Publicacion publicacion = publicacionRepository.findOne(pubId);
		publicacion.setTipoPublicacion(tipoPublicacionRepository
				.findOne((long) 4));
		publicacionRepository.save(publicacion);
	}

	@Override
	public PublicacionDTO getPublicacionDTO(Long publicacionId) {
		Publicacion pub = publicacionRepository.findOne(publicacionId);
		return publicacionDTOMapper.obtenerDTOdesdeObjetoDelDominio(pub);

	}

	@Override
	public Publicacion crearPublicacion(Empresa empresa, Users user,
			int tipoPublicacion, String cuerpo, String titulo, String imagen,
			String breveDescripcion, String url, String fuente, String tag,
			Long idEmpresaFuente, Long idPublicacionFuente) {
		Publicacion publicacion = new Publicacion();
		publicacion.setEmpresa(empresa);
		publicacion.setUsuarioCreador(user);
		publicacion.setFechaPublicacion(new Date());
		publicacion.setFechaUltimaModificacion(new Date());
		publicacion.setBreveDescripcion(breveDescripcion);
		publicacion.setTitulo(titulo);
		publicacion.setCuerpo(cuerpo);
		publicacion.setImagen(imagen);
		ArrayList<EstadoPublicacion> listaEstados = (ArrayList<EstadoPublicacion>) estadoPublicacionRepository
				.findAll();
		// Empresa empresaFuente = empresaRepository.findOne(idEmpresaFuente);

		if (idPublicacionFuente != null) {
			publicacion.setContadorReblog(publicacionRepository
					.findOne(idPublicacionFuente).getContadorReblog()
					.aumentarContador());
		} else {
			publicacion.setContadorReblog(new ContadorReblog());
		}
		publicacion.setEstadoPublicacion(listaEstados.get(0));
		publicacion.setUrl(url);
		String[] listaTags = tag.split(",");
		ArrayList<String> tags_ = new ArrayList<String>();
		for (int i = 0; i < listaTags.length; i++) {
			tags_.add(listaTags[i]);
		}
		publicacion.setTags(tags_);
		publicacion.setFuente(fuente);
		publicacion.setIdEmpresaFuente(idEmpresaFuente);

		switch (tipoPublicacion) {
		case 1:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("enlace").get(0));
			break;
		case 2:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("imagen").get(0));
			break;
		case 3:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("noticia").get(0));
			break;
		case 4:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("estado").get(0));
			break;
		case 5:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("video").get(0));
			break;
		case 6:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("menciones").get(0));
			break;
		}

		Sujeto.getInstancia().publicar();

		return publicacionRepository.save(publicacion);
	}

	@Override
	public Publicacion crearPublicacion(Empresa empresa, Users user,
			int tipoPublicacion, String cuerpo, String titulo, String imagen,
			String breveDescripcion, String url, String fuente, String tag,
			Long idEmpresaFuente) {
		Publicacion publicacion = new Publicacion();
		publicacion.setEmpresa(empresa);
		publicacion.setUsuarioCreador(user);
		publicacion.setFechaPublicacion(new Date());
		publicacion.setFechaUltimaModificacion(new Date());
		publicacion.setBreveDescripcion(breveDescripcion);
		publicacion.setTitulo(titulo);
		publicacion.setCuerpo(cuerpo);
		publicacion.setImagen(imagen);
		ArrayList<EstadoPublicacion> listaEstados = (ArrayList<EstadoPublicacion>) estadoPublicacionRepository
				.findAll();
		// Empresa empresaFuente = empresaRepository.findOne(idEmpresaFuente);

		// publicacion.setContadorReblog(publicacionRepository
		// .findOne(idPublicacionFuente).getContadorReblog()
		// .aumentarContador());
		publicacion.setEstadoPublicacion(listaEstados.get(0));
		publicacion.setUrl(url);
		publicacion.setContadorReblog(new ContadorReblog());
		String[] listaTags = tag.split(",");
		ArrayList<String> tags_ = new ArrayList<String>();
		for (int i = 0; i < listaTags.length; i++) {
			tags_.add(listaTags[i]);
		}
		publicacion.setTags(tags_);
		publicacion.setFuente(fuente);
		publicacion.setIdEmpresaFuente(idEmpresaFuente);

		switch (tipoPublicacion) {
		case 1:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("enlace").get(0));
			break;
		case 2:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("imagen").get(0));
			break;
		case 3:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("noticia").get(0));
			break;
		case 4:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("estado").get(0));
			break;
		case 5:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("video").get(0));
			break;
		case 6:
			publicacion.setTipoPublicacion(tipoPublicacionRepository
					.findAllByDescripcion("menciones").get(0));
			break;
		}

		Sujeto.getInstancia().publicar();

		return publicacionRepository.save(publicacion);
	}

}
